package flags

import "flag"

/////////////////////////////////////////////
/// 执行命令的选项
////////////////////////////////////////////

type Option struct {
	DB     bool
	User   string // -u admin -u user
	Load   string // 导入数据库文件
	Dump   bool   // 导出数据库
	ES     bool   // 创建索引
	ESDump bool   // 导出es索引
	ESLoad string // 导入es索引
}

// parse 解析命令行参数
// 利用Go标准库中的flag包进行处理命令行参数
// 在Linux中，我们可以使用argc argv 来存储我们传入的参数，然后使用switch语句就可以实现不同的功能
func Parse() (option *Option) {
	option = new(Option)
	// 使用stringvar 来定义一个字符串类型的命令行参数 -u
	flag.StringVar(&option.User, "u", "", "创建用户")
	// 使用boolvar 来定义一个布尔类型的命令行参数 -db
	flag.BoolVar(&option.DB, "db", false, "初始化数据库")
	flag.BoolVar(&option.ES, "es", false, "创建索引")
	flag.BoolVar(&option.Dump, "dump", false, "导出sql数据库")
	flag.StringVar(&option.Load, "load", "", "导入sql数据库")
	flag.BoolVar(&option.ESDump, "esdump", false, "导出es索引")
	flag.StringVar(&option.ESLoad, "esload", "", "导入es索引")
	flag.Parse()  // 解析命令行参数，这一步会根据定义的参数和实际传入的命令行参数进行匹配
	return option // 这个结构体包含了所有命令行参数的值
}

// Run根据命令执行不同的函数
func (option Option) Run() bool {
	if option.DB {
		DB()
		return true
	}
	if option.User == "admin" || option.User == "user" {
		CreateUser(option.User)
		return true
	}
	//if option.Load != "" {
	//	Load(option.Load)
	//	return true
	//}
	if option.ES {
		ESIndex()
		return true
	}
	//if option.Dump {
	//	Dump()
	//	return true
	//}
	//if option.ESDump {
	//	ESDump()
	//	return true
	//}
	//if option.ESLoad != "" {
	//	ESLoad(option.ESLoad)
	//	return true
	//}
	return false
}
